package main

import "fmt"

type Human struct {
	name string
	age int
	phone string
}

type Student struct {
	Human //匿名字段
	school string
}

type Employee struct {
	Human //匿名字段
	company string
}

// Human的方法
func (h *Human) SayHello() {
	fmt.Printf("Hello, I am %s, call me on %s\n", h.name, h.phone)
}

//重写Human的方法
func (e *Employee) SayHello()  {
	fmt.Printf("Hello, I am %s, I work at %s, call me on %s\n", e.name, e.company, e.phone)
}


func main() {
	// method也是可以继承的。
	// 如果匿名字段实现了一个method，那么包含这个匿名字段的struct也能调用该method
	jam := Student {
		Human {
			"Jam",
			25,
			"123456"},
		"Peking"}
	jam.SayHello() //Human的原始方法

	divaid := Employee{
		Human{
			"Divid",
			30,
			"123567",
		},
		"Baidu",
	}

	divaid.SayHello() //Employee重写后的方法
}
